﻿<!DOCTYPE html>
<html class="theme theme-white">
<head>
<meta charset="utf-8">
<title>数据库面试题</title>
<link href="https://www.zybuluo.com/static/assets/template-theme-white.css" rel="stylesheet" media="screen">
<style type="text/css">

#wmd-preview h1  {
    color: #0077bb; /* 将标题改为蓝色 */
}</style>
</head>
<body class="theme theme-white">
<div id="wmd-preview" class="wmd-preview wmd-preview-full-reader"><div class="md-section-divider"></div><div class="md-section-divider"></div><h1 data-anchor-id="zlyi" id="数据库面试题">数据库面试题</h1><p data-anchor-id="r7e6"><code>数据库</code> <code>Java面试题</code></p><hr><div class="md-section-divider"></div><h3 data-anchor-id="t7y5" id="什么是存储过程有哪些优缺点">什么是存储过程？有哪些优缺点？</h3><p data-anchor-id="0lji">存储过程是一些预编译的SQL语句。</p><p data-anchor-id="76vg">更加直白的理解：存储过程可以说是一个记录集，它是由一些T-SQL语句组成的代码块，这些T-SQL语句代码像一个方法一样实现一些功能（对单表或多表的增删改查），然后再给这个代码块取一个名字，在用到这个功能的时候调用他就行了。</p><p data-anchor-id="7u0y">存储过程是一个预编译的代码块，执行效率比较高 <br>
一个存储过程替代大量T_SQL语句 ，可以降低网络通信量，提高通信速率 <br>
可以一定程度上确保数据安全</p><div class="md-section-divider"></div><h3 data-anchor-id="72ll" id="索引是什么有什么作用以及优缺点">索引是什么？有什么作用以及优缺点？</h3><p data-anchor-id="gqe0">索引是对数据库表中一或多个列的值进行排序的结构，是帮助MySQL高效获取数据的数据结构</p><p data-anchor-id="6zui">你也可以这样理解：索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中，索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中，索引也允许数据库程序迅速地找到表中的数据，而不必扫描整个数据库。</p><p data-anchor-id="wvn9">MySQL数据库几个基本的索引类型：普通索引、唯一索引、主键索引、全文索引</p><ul data-anchor-id="sa6t">
<li>索引加快数据库的检索速度</li>
<li>索引降低了插入、删除、修改等维护任务的速度</li>
<li>唯一索引可以确保每一行数据的唯一性</li>
<li>通过使用索引，可以在查询的过程中使用优化隐藏器，提高系统的性能</li>
<li>索引需要占物理和数据空间 </li>
</ul><div class="md-section-divider"></div><h3 data-anchor-id="4zvc" id="什么是事务">什么是事务？</h3><p data-anchor-id="3t4s">事务（Transaction）是并发控制的基本单位。所谓的事务，它是一个操作序列，这些操作要么都执行，要么都不执行，它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位，在每个事务结束时，都能保持数据一致性。</p><div class="md-section-divider"></div><h3 data-anchor-id="b0aw" id="数据库的乐观锁和悲观锁是什么">数据库的乐观锁和悲观锁是什么？</h3><p data-anchor-id="gdao">数据库管理系统（DBMS）中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。</p><p data-anchor-id="alo1">乐观并发控制(乐观锁)和悲观并发控制（悲观锁）是并发控制主要采用的技术手段。</p><ul data-anchor-id="x2sy">
<li>悲观锁：假定会发生并发冲突，屏蔽一切可能违反数据完整性的操作</li>
<li>乐观锁：假设不会发生并发冲突，只在提交操作时检查是否违反数据完整性。</li>
</ul><div class="md-section-divider"></div><h3 data-anchor-id="jj0i" id="使用索引查询一定能提高查询的性能吗为什么">使用索引查询一定能提高查询的性能吗？为什么</h3><p data-anchor-id="qja5">通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价.</p><p data-anchor-id="c9yj">索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:</p><ul data-anchor-id="wox9">
<li>基于一个范围的检索,一般查询返回结果集小于表中记录数的30%</li>
<li>基于非唯一性索引的检索</li>
</ul><div class="md-section-divider"></div><h3 data-anchor-id="0itu" id="单说一说dropdelete与truncate的区别">单说一说drop、delete与truncate的区别</h3><p data-anchor-id="c8pu">SQL中的drop、delete、truncate都表示删除，但是三者有一些差别</p><ul data-anchor-id="y2bj">
<li>delete和truncate只删除表的数据不删除表的结构</li>
<li>速度,一般来说: drop&gt; truncate &gt;delete </li>
<li>delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效; <br>
如果有相应的trigger,执行的时候将被触发. truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger. </li>
</ul><div class="md-section-divider"></div><h3 data-anchor-id="5r4p" id="dropdelete与truncate分别在什么场景之下使用">drop、delete与truncate分别在什么场景之下使用？</h3><ul data-anchor-id="hvgl">
<li>不再需要一张表的时候，用drop</li>
<li>想删除部分数据行时候，用delete，并且带上where子句</li>
<li>保留表而删除所有数据的时候用truncate</li>
</ul><div class="md-section-divider"></div><h3 data-anchor-id="e0ku" id="超键候选键主键外键分别是什么">超键、候选键、主键、外键分别是什么？</h3><p data-anchor-id="4age">超键：在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键，多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。</p><p data-anchor-id="x0hd">候选键：是最小超键，即没有冗余元素的超键。</p><p data-anchor-id="mmex">主键：数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键，且主键的取值不能缺失，即不能为空值（Null）。</p><p data-anchor-id="u5kd">外键：在一个表中存在的另一个表的主键称此表的外键。</p><div class="md-section-divider"></div><h3 data-anchor-id="aigy" id="什么是视图以及视图的使用场景有哪些">什么是视图？以及视图的使用场景有哪些？</h3><p data-anchor-id="7d0a">视图是一种虚拟的表，具有和物理表相同的功能。可以对视图进行增，改，查，操作，试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易，相比多表查询。</p><ul data-anchor-id="4q4s">
<li>只暴露部分字段给访问者，所以就建一个虚表，就是视图。</li>
<li>查询的数据来源于不同的表，而查询者希望以统一的方式查询，这样也可以建立一个视图，把多个表查询结果联合起来，查询者只需要直接从视图中获取数据，不必考虑数据来源于不同表所带来的差异</li>
</ul><div class="md-section-divider"></div><h3 data-anchor-id="nf9j" id="说一说三个范式">说一说三个范式。</h3><ul data-anchor-id="8h3n">
<li><p>第一范式（1NF）：数据库表中的字段都是单一属性的，不可再分。这个单一属性由基本类型构成，包括整型、实数、字符型、逻辑型、日期型等。</p></li>
<li><p>第二范式（2NF）：数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖（部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况），也即所有非关键字段都完全依赖于任意一组候选关键字。</p></li>
<li>第三范式（3NF）：在第二范式的基础上，数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖，指的是如 果存在"A → B → C"的决定关系，则C传递函数依赖于A。因此，满足第三范式的数据库表应该不存在如下依赖关系： 关键字段 → 非关键字段 x → 非关键字段y</li>
</ul><div class="md-section-divider"></div><h3 data-anchor-id="mpxn" id="mysql中myisam与innodb的区别至少5点">mysql中myisam与innodb的区别，至少5点。</h3><p data-anchor-id="on2f">（1） 问5点不同</p><p data-anchor-id="h8bz">答：1、 存储成本不一样，存储限制不一样； <br>
2、CPU使用成本不一样，innodb缓存数据和索引； <br>
3、锁粒度不一样，支持MVCC； <br>
4、缓存机制不一样(buffer_pool和key_buffer) <br>
5、事务支持； <br>
6、索引支持：全文索引(myisam),外键(innodb)，hash(innodb) <br>
7、读写速度； <br>
8、备份；</p><p data-anchor-id="uf64">（2）2者的索引的实现方式；</p><p data-anchor-id="2f1l">myisam将索引和数据分开存放，索引记录索引中键值的物理位置，根据物理位置去MYD的数据页中寻找对应的data page；数据排列是堆数据，没有物理顺序，索引只是在逻辑上将数据串起来，并不改变数据的物理位置；</p><p data-anchor-id="jhl2">innodb采用主键将数据进行物理排序存放，新插入的数据根据主键的大小，会修改主键索引的序列；secondary index通过查找主键来查找数据；</p><div class="md-section-divider"></div><h3 data-anchor-id="6887" id="问mysql中varchar与char的区别以及varchar30中的30代表的涵义">问mysql中varchar与char的区别以及varchar(30)中的30代表的涵义。</h3><p data-anchor-id="42rl">（1） varchar与char的区别</p><p data-anchor-id="t1m6">答：变长和固定长度</p><p data-anchor-id="873b">（2）varchar(50)中50的涵义</p><p data-anchor-id="ose0">答： 字符最大长度50，所代表的字节数与字符集有关，比如是utf8占3个字节，那么varchar(50)字段在表中最大取到150个字节</p><p data-anchor-id="ouh3">（3） int（20）中20的涵义</p><p data-anchor-id="7y3f">答：int是类型的数字，在2进制记录里，长度最大为20，数字范围是-2^19~(2^19-1)；</p><p data-anchor-id="vutg">（4）为什么MySQL这样设计？</p><p data-anchor-id="61fv">答：在varchar(M)中,varchar在一张表中最大的字节数目为65535，实际长度跟存放的内容有关；</p><div class="md-section-divider"></div><h3 data-anchor-id="3j29" id="mysql中innodb引擎的行锁是通过加在什么上完成或称实现的为什么是这样子的">MySQL中InnoDB引擎的行锁是通过加在什么上完成（或称实现）的？为什么是这样子的？</h3><p data-anchor-id="9ohp">Innodb的行锁是加在索引实现的；</p><p data-anchor-id="pcy8">原因是:innodb是将primary key index和相关的行数据共同放在B+树的叶节点；innodb一定会有一个primary key，secondary index查找的时候，也是通过找到对应的primary，再找对应的数据行；</p><div class="md-section-divider"></div><h3 data-anchor-id="0beh" id="结束">结束</h3></div>
</body>
</html>